package com.ihunanren.biz.result;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;

import com.alibaba.citrus.util.ClassUtil;

/**
 * 默认的result实现
 * @author kalman03
 */
public class ResultSupport implements Result {
	private static final long serialVersionUID = 1L;
	
	private boolean           success         = true;
    private Map<String, Object>               models          = new HashMap<String, Object>(4);
    private String            defaultModelKey;
    
    private Map<String, Object> errorMap = new HashMap<String, Object>(1);
    private String defaultErrorKey;
    
    /**
     * 创建一个result。
     */
    public ResultSupport() {
    }

    /**
     * 创建一个result。
     *
     * @param success 是否成功
     */
    public ResultSupport(boolean success) {
        this.success = success;
    }

    /**
     * 请求是否成功。
     *
     * @return 如果成功，则返回<code>true</code>
     */
    public boolean isSuccess() {
        return success;
    }

    /**
     * 设置请求成功标志。
     *
     * @param success 成功标志
     */
    public void setSuccess(boolean success) {
        this.success = success;
    }
    /**
     * 取得默认model对象的key。
     *
     * @return 默认model对象的key
     */
    public String getDefaultModelKey() {
        return StringUtils.defaultIfEmpty(defaultModelKey, DEFAULT_MODEL_KEY);
    }

    /**
     * 取得model对象。
     * 
     * <p>
     * 此调用相当于<code>getModels().get(DEFAULT_MODEL_KEY)</code>。
     * </p>
     *
     * @return model对象
     */
    public Object getDefaultModel() {
        return models.get(getDefaultModelKey());
    }

    /**
     * 设置model对象。
     * 
     * <p>
     * 此调用相当于<code>getModels().put(DEFAULT_MODEL_KEY, model)</code>。
     * </p>
     *
     * @param model model对象
     */
    public void setDefaultModel(Object model) {
        setDefaultModel(DEFAULT_MODEL_KEY, model);
    }

    /**
     * 设置model对象。
     * 
     * <p>
     * 此调用相当于<code>getModels().put(key, model)</code>。
     * </p>
     *
     * @param key 字符串key
     * @param model model对象
     */
    public void setDefaultModel(String key, Object model) {
        defaultModelKey = StringUtils.defaultIfEmpty(key, DEFAULT_MODEL_KEY);
        models.put(key, model);
    }

    /**
     * 取得所有model对象。
     *
     * @return model对象表
     */
    public Map<String, Object> getModels() {
        return models;
    }

    /**
     * 转换成字符串的表示。
     *
     * @return 字符串表示
     */
    public String toString() {
        StringBuffer buffer = new StringBuffer();

        buffer.append("Result {\n");
        buffer.append("    success    = ").append(success).append(",\n");
        buffer.append("    models     = {");

        if (models.isEmpty()) {
            buffer.append("}\n");
        } else {
            buffer.append("\n");

            for (Iterator<Entry<String, Object>> i = models.entrySet().iterator(); i.hasNext();) {
                Map.Entry<String, Object> entry = (Map.Entry<String, Object>) i.next();
                Object    key   = entry.getKey();
                Object    value = entry.getValue();

                buffer.append("        ").append(key).append(" = ");

                if (value != null) {
                    buffer.append("(").append(ClassUtil.getSimpleClassNameForObject(value)).append(") ");
                }

                buffer.append(value);

                if (i.hasNext()) {
                    buffer.append(",");
                }

                buffer.append("\n");
            }

            buffer.append("    }\n");
        }

        buffer.append("}");

        return buffer.toString();
    }
    
	@Override
	public void setErrorMsgMap(Map<String, Object> errorMap) {
		if(this.errorMap != null && !this.errorMap.isEmpty()){
			this.errorMap.putAll(errorMap);
		}else{
			this.errorMap = errorMap;
		}
	}

	@Override
	public void setErrorMsg(String key, Object value) {
		if(this.errorMap != null && !this.errorMap.isEmpty()){
			this.errorMap.put(key, value);
		}else{
			this.errorMap = new HashMap<String, Object>();
			this.errorMap.put(key, value);
		}
	}

	@Override
	public Map<String, Object> getErrorMsgMap() {
		return this.errorMap;
	}

	@Override
	public Object getDefaultErrorMsg() {
		if(this.errorMap != null && !this.errorMap.isEmpty()){
			return errorMap.get(defaultErrorKey);
		}
		return null;
	}
	@Override
	public void setDefaultErrorMsg(String errorMsg){
		if(errorMap == null){
			errorMap = new HashMap<String, Object>();
		}
		errorMap.put(defaultErrorKey, errorMsg);
	}
}